package edu.uoc.tds.pec4.vista;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import edu.uoc.tds.pec4.util.ExceptionUtils;
import edu.uoc.tds.pec4.util.LanguageUtils;
import java.net.MalformedURLException;
import java.rmi.*;
import edu.uoc.tds.pec4.gestor.*;
import edu.uoc.tds.pec4.model.SS4_Acceso;
import edu.uoc.tds.pec4.vista.base.JPanelBase;
import java.awt.event.ActionListener;

/**
 * Tecnicas de Desarrollo de Software - (UOC)
 * Clase para visualizar la pantalla inicial con el menu
 * @author Pedro Bauzá Picó
 * @version 1.0
 */
public class SS4_PantallaMenu extends JFrame implements ActionListener {

    private static final String languageUrl = "edu/uoc/tds/pec4/i18n/messages";

    /*ELEMENTOS PANTALLA*/
    private JMenuBar barraMenu;
    private JMenu menuMantenimiento;
    private JMenu menuEstadistica;
    private JMenu menuProgramacionEvento;
    private JMenu menuConexionInscripcion;
    private JMenu menuSistema;
    private JMenuItem subNuevoUsuario;
    private JMenuItem subNuevoCentro;
    private JMenuItem subTipoEvento;
    private JMenuItem subBuscarUsuario;
    private JMenuItem subBuscarCentro;
    private JMenuItem subPorcentaje;
    private JMenuItem subIngresoTotal;
    private JMenuItem subAsistentesEvento;
    private JMenuItem subEventosAsistente;
    private JMenu subGestionEvento;
    private JMenuItem subCheckInEvento;
    private JMenuItem subGestionEventoAlta;
    private JMenuItem subGestionEventoModificar;
    private JMenuItem subGestionEventoCancelar;
    private JMenuItem subGestionEventoVer;
    private JMenuItem subCambioContrasenya;
    private JMenuItem subInscripcionEvento;
    private JMenuItem subInformeEvento;
    private JMenuItem subAcceso;
    private JMenuItem subSalir;
    private JPanel panelCentral;

    /*GESTORES*/
    private GestorMantenimiento remotoMantenimiento;
    private GestorEvento remotoEvento;
    private GestorInformes remotoInformes;

    private GestorConexion remotoConexion;

    /*ENTIDADES*/
    private SS4_Acceso acceso;

    public SS4_PantallaMenu() {
        super("eGestioEvents");
        setPreferredSize(new Dimension(700, 550));
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setResizable(false);
        setLocation(210, 100);

        iniciarComponentes();

        pack();
        setVisible(true);

    }

    private void iniciarComponentes() {
        //Lanzamos la conexion con el RMI
        conexionRMI(true);

        barraMenu = new JMenuBar();
        add(barraMenu, BorderLayout.NORTH);

        //Configuracion barra de menu
        menuMantenimiento = new JMenu(LanguageUtils.getMessage("Menu.menuMantenimiento.titulo"));
        menuEstadistica = new JMenu(LanguageUtils.getMessage("Menu.menuEstadistica.titulo"));
        menuProgramacionEvento = new JMenu(LanguageUtils.getMessage("Menu.menuProgramacionEvento.titulo"));
        menuConexionInscripcion = new JMenu(LanguageUtils.getMessage("Menu.menuConexionInscripcion.titulo"));
        menuSistema = new JMenu(LanguageUtils.getMessage("Menu.menuSistema.titulo"));
        menuMantenimiento.setEnabled(false);
        menuEstadistica.setEnabled(false);
        menuProgramacionEvento.setEnabled(false);
        menuConexionInscripcion.setEnabled(false);
        barraMenu.add(menuMantenimiento);
        barraMenu.add(menuEstadistica);
        barraMenu.add(menuProgramacionEvento);
        barraMenu.add(menuConexionInscripcion);
        barraMenu.add(menuSistema);

        //Configuracion del menu Mantenimiento
        subNuevoUsuario = new JMenuItem(LanguageUtils.getMessage("Menu.subNuevoUsuario.titulo"));
        subNuevoCentro = new JMenuItem(LanguageUtils.getMessage("Menu.subNuevoCentro.titulo"));
        subTipoEvento = new JMenuItem(LanguageUtils.getMessage("Menu.subTipoEvento.titulo"));
        subBuscarUsuario = new JMenuItem(LanguageUtils.getMessage("Menu.subBuscarUsuario.titulo"));
        subBuscarCentro = new JMenuItem(LanguageUtils.getMessage("Menu.subBuscarCentro.titulo"));
        menuMantenimiento.add(subNuevoUsuario);
        menuMantenimiento.add(subNuevoCentro);
        menuMantenimiento.add(subTipoEvento);
        menuMantenimiento.add(subBuscarUsuario);
        menuMantenimiento.add(subBuscarCentro);

        //Configuracion del menu Estadistica
        subPorcentaje = new JMenuItem(LanguageUtils.getMessage("Menu.subPorcentaje.titulo"));
        subIngresoTotal = new JMenuItem(LanguageUtils.getMessage("Menu.subIngresoTotal.titulo"));
        subAsistentesEvento = new JMenuItem(LanguageUtils.getMessage("Menu.subAsistentesEvento.titulo"));
        subEventosAsistente = new JMenuItem(LanguageUtils.getMessage("Menu.subEventosAsistente.titulo"));
        menuEstadistica.add(subPorcentaje);
        menuEstadistica.add(subIngresoTotal);
        menuEstadistica.add(subAsistentesEvento);
        menuEstadistica.add(subEventosAsistente);

        //Configuracion del menu Eventos
        subGestionEvento = new JMenu(LanguageUtils.getMessage("Menu.subGestionEvento.titulo"));
        menuProgramacionEvento.add(subGestionEvento);
        subCheckInEvento = new JMenuItem(LanguageUtils.getMessage("Menu.subCheckInEvento.titulo"));
        menuProgramacionEvento.add(subCheckInEvento);
        subGestionEventoAlta = new JMenuItem(LanguageUtils.getMessage("Menu.subGestionEvento.Alta.titulo"));
        subGestionEventoModificar = new JMenuItem(LanguageUtils.getMessage("Menu.subGestionEvento.Modificar.titulo"));
        subGestionEventoCancelar = new JMenuItem(LanguageUtils.getMessage("Menu.subGestionEvento.Cancela.titulo"));
        subGestionEventoVer = new JMenuItem(LanguageUtils.getMessage("Menu.subGestionEvento.Ver.titulo"));
        subGestionEvento.add(subGestionEventoAlta);
        subGestionEvento.add(subGestionEventoModificar);
        subGestionEvento.add(subGestionEventoCancelar);
        subGestionEvento.add(subGestionEventoVer);

        //Configuracion del menu Conexion e Inscripcion
        subCambioContrasenya = new JMenuItem(LanguageUtils.getMessage("Menu.subCambioContrasenya.titulo"));
        subInscripcionEvento = new JMenuItem(LanguageUtils.getMessage("Menu.subInscripcionEvento.titulo"));
        subInformeEvento = new JMenuItem(LanguageUtils.getMessage("Menu.subInformeEvento.titulo"));
        menuConexionInscripcion.add(subCambioContrasenya);
        menuConexionInscripcion.add(subInscripcionEvento);
        menuConexionInscripcion.add(subInformeEvento);

        //Configuracion del menu Sistema
        subAcceso = new JMenuItem(LanguageUtils.getMessage("Menu.subAcceso.titulo"));
        subSalir = new JMenuItem(LanguageUtils.getMessage("Menu.subSalir.titulo"));
        menuSistema.add(subAcceso);
        menuSistema.add(subSalir);

        subNuevoUsuario.addActionListener(this);
        subNuevoCentro.addActionListener(this);
        subTipoEvento.addActionListener(this);
        subBuscarUsuario.addActionListener(this);
        subBuscarCentro.addActionListener(this);

        subPorcentaje.addActionListener(this);
        subIngresoTotal.addActionListener(this);
        subAsistentesEvento.addActionListener(this);
        subEventosAsistente.addActionListener(this);

        subGestionEvento.addActionListener(this);
        subCheckInEvento.addActionListener(this);
        subGestionEventoAlta.addActionListener(this);
        subGestionEventoModificar.addActionListener(this);
        subGestionEventoCancelar.addActionListener(this);
        subGestionEventoVer.addActionListener(this);

        subCambioContrasenya.addActionListener(this);
        subInscripcionEvento.addActionListener(this);
        subInformeEvento.addActionListener(this);

        subAcceso.addActionListener(this);
        subSalir.addActionListener(this);

        setPanelCentral(new SS4_PanelInicial());
    }

    private void conexionRMI(boolean p_Activacion) {
        try {
            if (p_Activacion) {
                setRemotoMantenimiento((GestorMantenimiento) Naming.lookup("rmi://localhost/GestorMantenimientoImpl"));
                setRemotoEvento((GestorEvento) Naming.lookup("rmi://localhost/GestorEventoImpl"));
                setRemotoConexion((GestorConexion) Naming.lookup("rmi://localhost/GestorConexionImpl"));
                setRemotoInformes((GestorInformes) Naming.lookup("rmi://localhost/GestorInformesImpl"));
            } else {
                setRemotoMantenimiento(null);
                setRemotoEvento(null);
                setRemotoConexion(null);
                setRemotoInformes(null);
            }
        } catch (NotBoundException e) {
            ExceptionUtils.visualizarError(ExceptionUtils.ERR_NotBound);
        } catch (MalformedURLException e) {
            ExceptionUtils.visualizarError(ExceptionUtils.ERR_MalformedURL);
        } catch (RemoteException e) {
            ExceptionUtils.visualizarError(ExceptionUtils.ERR_Remote);
        } catch (Exception e) {
            ExceptionUtils.visualizarError(ExceptionUtils.ERR_Inesperado);
        }
    }

    /*
     * Metodo que se ejecuta desde una llamada del acceso, donde recibie un codigo de perfil
     * 2: Asistente
     * 1: Personal de Secretaria
     * 0: Administrador
     * @param  p_Cod_perfil_usuario Perfil del usuario que ha realizado el acceso al sistema
     */
    public void activarMenu(int p_Tipo_usuario) {
        switch (p_Tipo_usuario) {
            case 2:
                menuConexionInscripcion.setEnabled(true);
                break;
            case 1:
                menuEstadistica.setEnabled(true);
                menuProgramacionEvento.setEnabled(true);
                break;
            case 0:
                menuMantenimiento.setEnabled(true);
                break;
        }
    }

    public JPanel getPanelCentral() {
        return panelCentral;
    }

    public void setPanelCentral(JPanel panelCentral) {
        if (this.panelCentral != null) {
            remove(this.panelCentral);
        }
        this.panelCentral = panelCentral;
        add(this.panelCentral, BorderLayout.CENTER);
        pack();

    }

    private void cerrarAplicacion()
    {
        try{
            conexionRMI(false);
            setVisible(false);
            finalize();
            System.exit(0);
        }catch(Throwable e){}

    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == subAcceso) {
            setPanelCentral(new SS4_PantallaAcceso(this));
        } else if (e.getSource() == subSalir) {
            cerrarAplicacion();
        } else if (e.getSource() == subNuevoUsuario) {
            setPanelCentral(new SS1_PanelGestionarUsuario(this));
        } else if (e.getSource() == subNuevoCentro) {
            setPanelCentral(new SS1_PanelGestionarCentroDocente(this));
        } else if (e.getSource() == subTipoEvento) {
            setPanelCentral(new SS1_PanelGestionarTipoEvento(this));
        } else if (e.getSource() == subBuscarUsuario) {
            setPanelCentral(new SS1_PanelConsultaUsuarios(this));
        } else if (e.getSource() == subBuscarCentro) {
            setPanelCentral(new SS1_PanelConsultaCentrosDocentes(this));
        } else if (e.getSource() == subPorcentaje) {
            setPanelCentral(new SS3_PantallaPorcentajeAsistenciaEventos(remotoInformes));
        } else if (e.getSource() == subIngresoTotal) {
            setPanelCentral(new SS3_PantallaIngresosTotales(remotoInformes));
        } else if (e.getSource() == subAsistentesEvento) {
            setPanelCentral(new SS3_PantallaAsistenciaEvento(remotoInformes));
        } else if (e.getSource() == subEventosAsistente) {
            setPanelCentral(new SS3_PantallaEventosAsistente(remotoInformes));
        } else if (e.getSource() == subGestionEventoAlta) {
            setPanelCentral(new SS2_PantallaAltaEvento(remotoEvento));
        } else if (e.getSource() == subGestionEventoModificar) {
            setPanelCentral(new SS2_PantallaModificaEvento(remotoEvento));
        } else if (e.getSource() == subGestionEventoCancelar) {
            setPanelCentral(new SS2_PantallaCancelarEvento(remotoEvento));
        } else if (e.getSource() == subGestionEventoVer) {
            setPanelCentral(new SS2_PantallaVerAsisEvento(remotoEvento));
        } else if (e.getSource() == subCheckInEvento) {
            setPanelCentral(new SS4_PantallaCheckInEvento(this));
        } else if (e.getSource() == subCambioContrasenya) {
            setPanelCentral(new SS4_PantallaCambioContrasenya(this));
        } else if (e.getSource() == subInscripcionEvento) {
            setPanelCentral(new SS4_PantallaInscripcion(this));
        } else if (e.getSource() == subInformeEvento) {
            setPanelCentral(new SS3_PantallaEventosAsistente(this, remotoInformes));
        } else {
            // Si no es ningún componente de la ventana, es alguno del panel
            ((JPanelBase) panelCentral).componentePulsado(e);
        }
    }

    /**
     * @param Argumentos para el inicio de la pantalla
     */
    public static void main(String[] args) {
        LanguageUtils.setDefaultLanguage(languageUrl);
        new SS4_PantallaMenu();
    }

    public GestorEvento getRemotoEvento() {
        return remotoEvento;
    }

    public void setRemotoEvento(GestorEvento remotoEvento) {
        this.remotoEvento = remotoEvento;
    }

    public GestorConexion getRemotoConexion() {
        return remotoConexion;
    }

    public void setRemotoConexion(GestorConexion remotoConexion) {
        this.remotoConexion = remotoConexion;
    }

    public GestorMantenimiento getRemotoMantenimiento() {
        return remotoMantenimiento;
    }

    public void setRemotoMantenimiento(GestorMantenimiento remotoMantenimiento) {
        this.remotoMantenimiento = remotoMantenimiento;
    }

    public SS4_Acceso getAcceso() {
        return acceso;
    }

    public void setAcceso(SS4_Acceso acceso) {
        this.acceso = acceso;
    }

    public GestorInformes getRemotoInformes() {
        return remotoInformes;
}

    public void setRemotoInformes(GestorInformes remotoInformes) {
        this.remotoInformes = remotoInformes;
    }
}
